<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>多字段匹配(multi_match)查询 | ElasticSearch 7.7 权威指南中文版</title>
	<meta name="keywords" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <meta name="description" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
	<script>
	var _link = 'query-dsl-multi-match-query.html';
    </script>
</head>
<body>
<div class="main-container">
    <section id="content">
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.7/query-dsl-multi-match-query.html" rel="nofollow" target="_blank">https://www.elastic.co/guide/en/elasticsearch/reference/7.7/query-dsl-multi-match-query.html</a>, 原文档版权归 www.elastic.co 所有<br/>本地英文版地址: <a href="../en/query-dsl-multi-match-query.html" rel="nofollow" target="_blank">../en/query-dsl-multi-match-query.html</a></div>
                        <!-- start body -->
                  <div class="page_header">
<strong>重要</strong>: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html" rel="nofollow">当前版本文档</a>。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch 权威指南 [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="query-dsl.html">查询领域特定语言(Query DSL)</a></span>
»
<span class="breadcrumb-link"><a href="full-text-queries.html">全文查询</a></span>
»
<span class="breadcrumb-node">多字段匹配(multi_match)查询</span>
</div>
<div class="navheader">
<span class="prev">
<a href="query-dsl-match-query-phrase-prefix.html">« 短语前缀匹配(match_phrase_prefix)查询</a>
</span>
<span class="next">
<a href="query-dsl-common-terms-query.html">常用(common)词项查询 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="query-dsl-multi-match-query"></a>多字段匹配(multi_match)查询
</h2>
</div></div></div>

<p>
<code class="literal">multi_match</code> 查询建立在 <a class="xref" href="query-dsl-match-query.html" title="Match query"><code class="literal">match</code> 查询</a>的基础上，以允许 多字段(multi-field) 查询:
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "multi_match" : {
      "query":    "this is a test", <a id="CO42-1"></a><i class="conum" data-value="1"></i>
      "fields": [ "subject", "message" ] <a id="CO42-2"></a><i class="conum" data-value="2"></i>
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/127.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO42-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>要查询的字符串。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO42-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>要查询的字段。</p>
</td>
</tr>
</table>
</div>
<h4>
<a id="field-boost"></a><code class="literal">fields</code> 和 字段增强(per-field boosting)
</h4>
<p>可以使用通配符指定字段名称，比如：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "multi_match" : {
      "query":    "Will Smith",
      "fields": [ "title", "*_name" ] <a id="CO43-1"></a><i class="conum" data-value="1"></i>
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/128.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO43-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>查询<code class="literal">title</code>、<code class="literal">first_name</code> 和 <code class="literal">last_name</code> 字段。</p>
</td>
</tr>
</table>
</div>
<p>单个字段可以用脱字符号(<code class="literal">^</code>)来增强：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "multi_match" : {
      "query" : "this is a test",
      "fields" : [ "subject^3", "message" ] <a id="CO44-1"></a><i class="conum" data-value="1"></i>
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/129.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO44-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>
字段 <code class="literal">subject</code> 的重要性是 <code class="literal">message</code> 的 <code class="literal">3</code> 倍。
</td>
</tr>
</table>
</div>
<p>
如果未指定 <code class="literal">fields</code>，则 <code class="literal">multi_match</code> 查询默认使用  <code class="literal">index.query.default_field</code> 索引设置，该设置又默认为 <code class="literal">*</code>。

<code class="literal">*</code> 提取映射中符合条件查询的所有字段，并过滤元数据字段。

然后将所有提取的字段组合起来构建一个查询。
</p>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<p>
一次可以查询的字段数量是有限制的。

它由 <code class="literal">indices.query.bool.max_clause_count</code> <a class="xref" href="search-settings.html" title="Search settings">搜索设置</a> 定义的，默认为 1024。
</p>
</div>
</div>
<h4>
<a id="multi-match-types"></a><code class="literal">multi_match</code>查询的类型：
</h4>
<p>
<code class="literal">multi_match</code> 查询在内部执行的方式取决于参数 <code class="literal">type</code>，该参数可设置为:
</p>
<div class="informaltable">
<table border="0" cellpadding="4px">
<colgroup>
<col>
<col>
</colgroup>
<tbody valign="top">
<tr>
<td valign="top">
<p>
<code class="literal">best_fields</code>
</p>
</td>
<td valign="top">
<p>
(<span class="strong strong"><strong>默认</strong></span>) 
查找与任何字段匹配的文档，但使用最佳字段的  <code class="literal">_score</code>。参见 <a class="xref" href="query-dsl-multi-match-query.html#type-best-fields" title="best_fields"><code class="literal">best_fields</code></a>。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">most_fields</code>
</p>
</td>
<td valign="top">
<p>
查找与任何字段匹配的文档，并合并每个字段的 <code class="literal">_score</code>。参见 <a class="xref" href="query-dsl-multi-match-query.html#type-most-fields" title="most_fields"><code class="literal">most_fields</code></a>。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">cross_fields</code>
</p>
</td>
<td valign="top">
<p>
用相同的 <code class="literal">analyzer</code> 处理字段，就好像它们是一个大字段。

在 <span class="strong strong"><strong>任何</strong></span> 字段中查找每个单词。

参见 <a class="xref" href="query-dsl-multi-match-query.html#type-cross-fields" title="cross_fields"><code class="literal">cross_fields</code></a>。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">phrase</code>
</p>
</td>
<td valign="top">
<p>
对每个字段运行 <code class="literal">match_phrase</code> 查询，并使用最佳字段(best field)的 <code class="literal">_score</code>。

参见 <a class="xref" href="query-dsl-multi-match-query.html#type-phrase" title="phrase and phrase_prefix"><code class="literal">phrase</code> 和 <code class="literal">phrase_prefix</code></a>。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">phrase_prefix</code>
</p>
</td>
<td valign="top">
<p>
对每个字段运行 <code class="literal">match_phrase_prefix</code> 查询，并使用最佳字段(best field)的 <code class="literal">_score</code>。

参见 <a class="xref" href="query-dsl-multi-match-query.html#type-phrase" title="phrase and phrase_prefix"><code class="literal">phrase</code> 和 <code class="literal">phrase_prefix</code></a>。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">bool_prefix</code>
</p>
</td>
<td valign="top">
<p>
在每个字段上创建 <code class="literal">match_bool_prefix</code> 查询，并组合每个字段的 <code class="literal">_score</code>。

参见 <a class="xref" href="query-dsl-multi-match-query.html#type-bool-prefix" title="bool_prefix"><code class="literal">bool_prefix</code></a>。
</p>
</td>
</tr>
</tbody>
</table>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="type-best-fields"></a><code class="literal">best_fields</code>
</h3>
</div></div></div>
<p>
<code class="literal">best_fields</code> 类型在搜索同一字段中最容易找到的多个单词时最有用。  

例如，一个字段里的“brown fox”比一个字段里的“brown”和另一个字段里的“fox”更有意义。
</p>
<p>
<code class="literal">best_fields</code> 类型为每个字段生成一个<a class="xref" href="query-dsl-match-query.html" title="Match query"><code class="literal">match</code> 查询</a>，并将它们包裹在一个 <a class="xref" href="query-dsl-dis-max-query.html" title="Disjunction max query"><code class="literal">dis_max</code></a> 查询中，以找到单个最佳匹配字段。

比如下面这个查询
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "multi_match" : {
      "query":      "brown fox",
      "type":       "best_fields",
      "fields":     [ "subject", "message" ],
      "tie_breaker": 0.3
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/130.console"></div>
<p>在执行时会被转换为：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "dis_max": {
      "queries": [
        { "match": { "subject": "brown fox" }},
        { "match": { "message": "brown fox" }}
      ],
      "tie_breaker": 0.3
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/131.console"></div>
<p>
通常，<code class="literal">best_fields</code> 类型使用<span class="strong strong"><strong>单个</strong></span>最佳匹配字段的分数，但如果指定了<code class="literal">tie_breaker</code>，则它会按如下方式计算分数：
</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
最佳匹配字段的分数
</li>
<li class="listitem">
给所有其他匹配的字段加上 <code class="literal">tie_breaker * _score</code>
</li>
</ul>
</div>
<p>
此外，接受 <code class="literal">analyzer</code>、<code class="literal">boost</code>、<code class="literal">operator</code>、<code class="literal">minimum_should_match</code>、<code class="literal">fuzziness</code>、<code class="literal">lenient</code>、<code class="literal">prefix_length</code>、<code class="literal">max_expansions</code>、<code class="literal">rewrite</code>、<code class="literal">zero_terms_query</code>、<code class="literal">cutoff_frequency</code>、<code class="literal">auto_generate_synonyms_phrase_query</code> 及 <code class="literal">fuzzy_transpositions</code>，如 <a class="xref" href="query-dsl-match-query.html" title="Match query">match 查询</a> 中所述。
  </p>
<div class="important admon">
<div class="icon"></div>
<div class="admon_content">
<h3>
<code class="literal">operator</code> 和 <code class="literal">minimum_should_match</code><a id="operator-min"></a>
</h3>
<p>
<code class="literal">best_fields</code> 和 <code class="literal">most_fields</code> 类型是<em>以字段为中心(field-centric)</em>的，它们为<span class="strong strong"><strong>每个字段</strong></span>生成一个 <code class="literal">match</code> 查询。

这意味着 <code class="literal">operator</code> 和 <code class="literal">minimum_should_match</code> 参数分别应用于每个字段，这可能不是你想要的。
</p>
<p>以下面这个查询为例：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "multi_match" : {
      "query":      "Will Smith",
      "type":       "best_fields",
      "fields":     [ "first_name", "last_name" ],
      "operator":   "and" <a id="CO45-1"></a><i class="conum" data-value="1"></i>
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/132.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO45-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>所有词项必须都出现。</p>
</td>
</tr>
</table>
</div>
<p>该查询按如下方式执行：</p>
<pre class="literallayout">  (+first_name:will +first_name:smith)
| (+last_name:will  +last_name:smith)</pre>
<p>
换句话说，<span class="strong strong"><strong>所有词项</strong></span>必须出现在<span class="strong strong"><strong>一个字段</strong></span>中，文档才能匹配。
</p>
<p>
更好的解决方案请参考 <a class="xref" href="query-dsl-multi-match-query.html#type-cross-fields" title="cross_fields"><code class="literal">cross_fields</code></a>。</p>
</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="type-most-fields"></a><code class="literal">most_fields</code>
</h3>
</div></div></div>
<p>
当查询包含以不同方式分析的相同文本的多个字段时，<code class="literal">most_fields</code> 类型最有用。

例如，主字段可能包含同义词(synonyms)、词干(stemming)和不带发音符号(diacritics)的词项。

第二个字段可能包含原始的(original)词项(term)，第三个字段可能包含 shingles<span class="remark">(不知道该怎么翻译)</span>。

通过组合所有三个字段的分数，我们可以将尽可能多的文档与主字段匹配，但使用第二个和第三个字段将最相似的结果推到列表的顶部。
</p>
<p>下面这个查询</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "multi_match" : {
      "query":      "quick brown fox",
      "type":       "most_fields",
      "fields":     [ "title", "title.original", "title.shingles" ]
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/133.console"></div>
<p>在执行时会被转换为：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "title":          "quick brown fox" }},
        { "match": { "title.original": "quick brown fox" }},
        { "match": { "title.shingles": "quick brown fox" }}
      ]
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/134.console"></div>
<p>
每个 <code class="literal">match</code> 子句的得分相加，然后除以 <code class="literal">match</code> 子句的数量。
</p>
<p>
此外，接受<code class="literal">analyzer</code>、<code class="literal">boost</code>、<code class="literal">operator</code>、<code class="literal">minimum_should_match</code>、<code class="literal">fuzziness</code>、<code class="literal">lenient</code>、<code class="literal">prefix_length</code>、<code class="literal">max_expansions</code>、<code class="literal">rewrite</code>、<code class="literal">zero_terms_query</code> 及 <code class="literal">cutoff_frequency</code>，如 <a class="xref" href="query-dsl-match-query.html" title="Match query">match 查询</a> 中所述，但是 <span class="strong strong"><strong>请参见 <a class="xref" href="query-dsl-multi-match-query.html#operator-min" title="operator and minimum_should_match"><code class="literal">operator</code> 和 <code class="literal">minimum_should_match</code></a></strong></span>。
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="type-phrase"></a><code class="literal">phrase</code> 和 <code class="literal">phrase_prefix</code>
</h3>
</div></div></div>
<p>
<code class="literal">phrase</code> 和 <code class="literal">phrase_prefix</code> 类型的行为类似于<a class="xref" href="query-dsl-multi-match-query.html#type-best-fields" title="best_fields"><code class="literal">best_fields</code></a>，但是它们使用 <code class="literal">match_phrase</code> 或 <code class="literal">match_phrase_prefix</code>查询而不是 <code class="literal">match</code> 查询。
</p>
<p>下面这个查询</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "multi_match" : {
      "query":      "quick brown f",
      "type":       "phrase_prefix",
      "fields":     [ "subject", "message" ]
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/135.console"></div>
<p>在执行时会被转换为：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "dis_max": {
      "queries": [
        { "match_phrase_prefix": { "subject": "quick brown f" }},
        { "match_phrase_prefix": { "message": "quick brown f" }}
      ]
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/136.console"></div>
<p>
此外，还接受 <a class="xref" href="query-dsl-match-query.html" title="Match query">match</a> 中所述的 <code class="literal">analyzer</code>、<a class="xref" href="mapping-boost.html" title="boost"><code class="literal">boost</code></a>、<code class="literal">lenient</code> 及 <code class="literal">zero_terms_query</code>，以及 <a class="xref" href="query-dsl-match-query-phrase.html" title="Match phrase query">match phrase</a> 中介绍的 <code class="literal">slop</code> 。

<code class="literal">phrase_prefix</code> 类型还接受 <code class="literal">max_expansions</code>。
</p>
<div class="important admon">
<div class="icon"></div>
<div class="admon_content">
<h3>
<code class="literal">phrase</code>, <code class="literal">phrase_prefix</code> 和 <code class="literal">fuzziness</code><a id="phrase-fuzziness"></a>
</h3>
<p>
参数 <code class="literal">fuzziness</code> 不能与 <code class="literal">phrase</code> 和 <code class="literal">phrase_prefix</code> 一起使用。
</p>
</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="type-cross-fields"></a><code class="literal">cross_fields</code>
</h3>
</div></div></div>
<p>
<code class="literal">cross_fields</code> 类型对于多个字段<span class="strong strong"><strong>should(应该)</strong></span>匹配的结构化文档特别有用。

例如，当在 <code class="literal">first_name</code> 和 <code class="literal">last_name</code>字段查询“Will Smith”时，最佳匹配可能是一个字段中有“Will ”,另一个字段中有“Smith”。
</p>
<div class="sidebar">
<div class="titlepage"></div>
<p>
这听起来像是 <a class="xref" href="query-dsl-multi-match-query.html#type-most-fields" title="most_fields"><code class="literal">most_fields</code></a> 的工作，但是那个方法有两个问题。
</p>
<p>
第一个问题是 <code class="literal">operator</code> 和 <code class="literal">minimum_should_match</code> 是按字段应用的，而不是按词项应用的(见 <a class="xref" href="query-dsl-multi-match-query.html#operator-min" title="operator and minimum_should_match">上面的解释</a>)。
</p>
<p>
第二个问题与相关性有关：<code class="literal">first_name</code> 和 <code class="literal">last_name</code> 字段中不同的词频可能会产生意外的结果。
</p>
<p>
例如，假设我们有两个人：“Will Smith“ 和 “Smith Jones“。

“Smith“ 作为 姓(last name) 是很常见的(因此不太重要)，但是“Smith“作为 名(first name) 是很少见的(因此非常重要)。
</p>
<p>
如果我们搜索“Will Smith“，文档“Smith Jones”可能会出现在更匹配的“Will Smith”之上，因为 <code class="literal">first_name:smith</code> 的分数已经超过了 <code class="literal">first_name:will</code> 加上<code class="literal">last_name:smith</code> 的组合分数。
</p>
</div>
<p>
处理这些类型的查询的一种方法是简单地将 <code class="literal">first_name</code>和 <code class="literal">last_name</code> 字段索引到单个<code class="literal">full_name</code>字段中。当然，这只能在索引时完成。
</p>
<p>
<code class="literal">cross_field</code> 类型试图通过采用<em>以词项为中心(term-centric)</em>的方法在查询时解决这些问题。

它首先将查询字符串分析成单个词项，然后在任何字段中查找每个词项，就好像它们是一个大字段一样。
</p>
<p>像下面这样的一个查询</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "multi_match" : {
      "query":      "Will Smith",
      "type":       "cross_fields",
      "fields":     [ "first_name", "last_name" ],
      "operator":   "and"
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/137.console"></div>
<p>会被执行为：</p>
<pre class="literallayout">+(first_name:will  last_name:will)
+(first_name:smith last_name:smith)</pre>

<p>
换句话说，<span class="strong strong"><strong>所有词项</strong></span> 必须出现在<span class="strong strong"><strong>至少一个字段</strong></span>中，文档才能匹配。

(将这与 <a class="xref" href="query-dsl-multi-match-query.html#operator-min" title="operator and minimum_should_match">用于 <code class="literal">best_fields</code> 和 <code class="literal">most_fields</code> 的逻辑</a> 进行比较。)
</p>
<p>
这解决了两个问题中的一个。

不同词频的问题通过<em>混合(blending)</em>所有字段的词频以消除差异来解决。
</p>
<p>
实际上，<code class="literal">first_name:smith</code> 将被视为与<code class="literal">last_name:smith</code> + 1 具有相同的频率。

这将使 <code class="literal">first_name</code> 和 <code class="literal">last_name</code> 的匹配项具有可比较的分数，<code class="literal">last_name</code> 有一点优势，因为它是最有可能包含<code class="literal">smith</code>的字段。
</p>
<p>
请注意，<code class="literal">cross_fields</code> 通常只对 <code class="literal">boost</code> 都为 <code class="literal">1</code> 的短字符串字段有用。

否则 boost、词频和长度归一化会以这样的一种方式影响分数，以至于词项统计数据的混合不再有意义。
</p>
<p>
如果你通过 <a class="xref" href="search-validate.html" title="Validate API">Validate API</a> 运行上述查询，它将返回如下解释:
</p>
<pre class="literallayout">+blended("will",  fields: [first_name, last_name])
+blended("smith", fields: [first_name, last_name])</pre>

<p>
此外，还接受 <code class="literal">analyzer</code>、<code class="literal">boost</code>、<code class="literal">operator</code>、<code class="literal">minimum_should_match</code>、<code class="literal">lenient</code>、<code class="literal">zero_terms_query</code> 及 <code class="literal">cutoff_frequency</code>，如 <a class="xref" href="query-dsl-match-query.html" title="Match query">match 查询</a> 中所述。
</p>
<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="cross-field-analysis"></a><code class="literal">cross_field</code> 和分析(analysis)
</h4>
</div></div></div>
<p>
<code class="literal">cross_field</code> 类型只能在具有相同分析器的字段上以词项为中心(term-centric)的模式下工作。

如上例所示，具有相同分析器的字段被分组在一起。

如果有多个组，它们将与一个 <code class="literal">bool</code> 查询组合在一起。
</p>
<p>
例如，如果字段 <code class="literal">first</code> 和 <code class="literal">last</code> 具有相同的分析器，加上 <code class="literal">first.edge</code> 和 <code class="literal">last.edge</code> 都使用 <code class="literal">edge_ngram</code> 分析器，则下面这个查询
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "multi_match" : {
      "query":      "Jon",
      "type":       "cross_fields",
      "fields":     [
        "first", "first.edge",
        "last",  "last.edge"
      ]
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/138.console"></div>
<p>将被执行为：</p>
<pre class="literallayout">    blended("jon", fields: [first, last])
| (
    blended("j",   fields: [first.edge, last.edge])
    blended("jo",  fields: [first.edge, last.edge])
    blended("jon", fields: [first.edge, last.edge])
)</pre>

<p>
换句话说，<code class="literal">first</code> 和 <code class="literal">last</code> 将被分组在一起并被视为单个字段，<code class="literal">first.edge</code> and <code class="literal">last.edge</code> 将被分组在一起并被视为单个字段。
</p>
<p>
拥有多个组是可以的，但是当与 <code class="literal">operator</code> 或 <code class="literal">minimum_should_match</code> 结合使用时，它可能会遇到与<code class="literal">most_fields</code> 或 <code class="literal">best_fields</code> <a class="xref" href="query-dsl-multi-match-query.html#operator-min" title="operator and minimum_should_match">相同的问题</a>。
</p>
<p>
可以很容易地将该查询重写为两个单独的 <code class="literal">cross_fields</code> 查询与一个 <code class="literal">bool</code> 查询的组合，并将 <code class="literal">minimum_should_match</code> 参数应用于其中一个查询:
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "bool": {
      "should": [
        {
          "multi_match" : {
            "query":      "Will Smith",
            "type":       "cross_fields",
            "fields":     [ "first", "last" ],
            "minimum_should_match": "50%" <a id="CO46-1"></a><i class="conum" data-value="1"></i>
          }
        },
        {
          "multi_match" : {
            "query":      "Will Smith",
            "type":       "cross_fields",
            "fields":     [ "*.edge" ]
          }
        }
      ]
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/139.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO46-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>
<code class="literal">will</code> 或 <code class="literal">smith</code> 必须出现在 <code class="literal">first</code> 或 <code class="literal">last</code> 字段中
</p>
</td>
</tr>
</table>
</div>
<p>
通过在查询中指定 <code class="literal">analyzer</code> 参数，可以强制将所有字段归入同一组。
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
   "multi_match" : {
      "query":      "Jon",
      "type":       "cross_fields",
      "analyzer":   "standard", <a id="CO47-1"></a><i class="conum" data-value="1"></i>
      "fields":     [ "first", "last", "*.edge" ]
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/140.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO47-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>对所有字段使用 <code class="literal">standard</code> 分析器。</p>
</td>
</tr>
</table>
</div>
<p>它将被执行为：</p>
<pre class="literallayout">blended("will",  fields: [first, first.edge, last.edge, last])
blended("smith", fields: [first, first.edge, last.edge, last])</pre>

</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="tie-breaker"></a><code class="literal">tie_breaker</code>
</h4>
</div></div></div>
<p>
默认情况下，每个按词项 <code class="literal">blended</code>(混合的) 查询将使用组中任何字段返回的最佳分数，然后将这些分数相加得到最终分数。

参数 <code class="literal">tie_breaker</code> 可以更改按词项 <code class="literal">blended</code>(混合的) 查询的默认行为。

它接受：
</p>
<div class="informaltable">
<table border="0" cellpadding="4px">
<colgroup>
<col>
<col>
</colgroup>
<tbody valign="top">
<tr>
<td valign="top">
<p>
<code class="literal">0.0</code>
</p>
</td>
<td valign="top">
<p>
取单个最佳分数（<span class="strong strong"><strong>默认</strong></span>）。（比如从<code class="literal">first_name:will</code>和<code class="literal">last_name:will</code>中取最佳分数）
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">1.0</code>
</p>
</td>
<td valign="top">
<p>
将分数相加。（比如把<code class="literal">first_name:will</code>和<code class="literal">last_name:will</code>的分数相加）
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">0.0 &lt; n &lt; 1.0</code>
</p>
</td>
<td valign="top">
<p>
将单个最佳分数加上 <code class="literal">tie_breaker</code> 乘以其他匹配字段中的每个分数。
</p>
</td>
</tr>
</tbody>
</table>
</div>
<div class="important admon">
<div class="icon"></div>
<div class="admon_content">
<h3>
<code class="literal">cross_fields</code>和<code class="literal">fuzziness</code><a id="crossfields-fuzziness"></a>
</h3>
<p>参数<code class="literal">fuzziness</code>不能与<code class="literal">cross_fields</code>类型一起使用。</p>
</div>
</div>
</div>

</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="type-bool-prefix"></a><code class="literal">bool_prefix</code>
</h3>
</div></div></div>
<p>
<code class="literal">bool_prefix</code>类型的评分行为类似于<a class="xref" href="query-dsl-multi-match-query.html#type-most-fields" title="most_fields"><code class="literal">most_fields</code></a>，但使用 <a class="xref" href="query-dsl-match-bool-prefix-query.html" title="Match boolean prefix query"><code class="literal">match_bool_prefix</code> 查询</a> 而不是 <code class="literal">match</code> 查询。
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "multi_match" : {
      "query":      "quick brown f",
      "type":       "bool_prefix",
      "fields":     [ "subject", "message" ]
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/141.console"></div>
<p>
支持 <a class="xref" href="query-dsl-match-query.html" title="Match query">match 查询</a> 中所述的参数 <code class="literal">analyzer</code>、<code class="literal">boost</code>、<code class="literal">operator</code>、<code class="literal">minimum_should_match</code>、<code class="literal">lenient</code>、<code class="literal">zero_terms_query</code> 及 <code class="literal">auto_generate_synonyms_phrase_query</code>。

用于构建词项<span class="remark">(term, "条件"??)</span>查询的词项支持<code class="literal">fuzziness</code>、<code class="literal">prefix_length</code>、<code class="literal">max_expansions</code>、<code class="literal">rewrite</code> 及 <code class="literal">fuzzy_transpositions</code> 参数，但这些参数对从最终的词项构建的前缀查询没有作用。
</p>
<p>
该查询类型不支持<code class="literal">slop</code> 和 <code class="literal">cutoff_frequency</code> 参数。
</p>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="query-dsl-match-query-phrase-prefix.html">« 短语前缀匹配(match_phrase_prefix)查询</a>
</span>
<span class="next">
<a href="query-dsl-common-terms-query.html">常用(common)词项查询 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>